home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / pascal / swag / archives.swg / 0019_Checking for SFX headers.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-02-03  |  1.8 KB  |  66 lines

  1.  
  2. { Detection of ZIP and ARJ SFX files }
  3.  
  4. {$S-,V-,D+,I-}
  5. USES DOS;
  6.  
  7.  
  8. TYPE
  9.   ArchiveTypes = (NONE,ARJ,PKZIP);
  10.   Header = RECORD
  11.            HeadId  : WORD;                                      { 60000 }
  12.            SIG1    : WORD;                          { Basic Header Size }
  13.   END;
  14.  
  15. VAR
  16.  
  17.    ArchiveName   : PathStr;
  18.    ArchiveSize   : LongInt;  { actual size of archive }
  19.    ArchiveOffset : LongInt;  { bytes to skip in header if SFX }
  20.    ArchiveKind   : ArchiveTypes;
  21.  
  22.   FUNCTION CheckSfx(SfxName : PathStr) : BOOLEAN;
  23.  
  24.   {-check for self-extracting archive}
  25.   {-if Sfx Exe: set ArchiveName and ArchiveOffset}
  26.   Var ImageInfo : Record
  27.                     ExeId : Array[0..1] Of Char;
  28.                     Remainder,
  29.                     size : Word
  30.                   End;
  31.     SfxExe : File;
  32.     H  : Header;
  33.     rd : Word;
  34.     Err : Boolean;
  35.     AOffset : LongInt;
  36.     ExeId : Array[0..1] Of Char;
  37.  
  38.   Begin
  39.  
  40.     CheckSFX := FALSE;
  41.     Assign(SfxExe, SfxName); Reset(SfxExe, 1);
  42.     If IoResult > 0 Then Exit;
  43.  
  44.     ArchiveName   := SfxName;
  45.     ArchiveOffset := 0;
  46.     ArchiveSize   := Filesize(SfxExe);
  47.     BlockRead(SfxExe, ImageInfo, SizeOf(ImageInfo));
  48.     If ImageInfo.ExeId <> 'MZ' Then Exit;
  49.     AOffset := LongInt(ImageInfo.size-1)*512+ImageInfo.Remainder;
  50.     Seek(SfxExe, AOffset);
  51.     If IoResult > 0 Then Exit;
  52.     BlockRead(SfxExe, H, SizeOf(H), rd);
  53.     Err := (IoResult > 0) Or (rd < SizeOf(Header));
  54.     Close(SfxExe);
  55.     If Err Then Exit;
  56.     ArchiveName   := SfxName;
  57.     ArchiveOffset := AOffset + (ORD(BOOLEAN(H.Sig1 = $EA60)) * 2); { add 2 bytes for ARJ241}
  58.     ArchiveKind   := ArchiveTypes(ORD(ArchiveOffset > 0) + ORD(BOOLEAN(H.Sig1 <> $EA60)));
  59.     CheckSfx      := (ArchiveOffset > 0);
  60.   End;
  61.  
  62.                                                
  63. BEGIN
  64. ArchiveName := ParamStr(1);
  65. CheckSfx(archivename);
  66. END.